// Wprowadzenie do liczenia referencji

#import <Foundation/Foundation.h>

@interface ClassA: NSObject
{
    NSString *str;
}

-(void) setStr: (NSString *) s;
-(NSString *) str;
-(void) dealloc;
@end

@implementation ClassA
-(void) setStr: (NSString *) s
{
    // Zwolnienie starego obiektu, ktry nie jest ju potrzebny
    [str autorelease];

    // Zatrzymanie obiektu na wypadek, gdyby mia zosta zwolniony gdzie indziej
    str = [s retain];
}

-(NSString *) str
{
    return str;
}

-(void) dealloc {
    NSLog (@"Metoda dealloc klasy ClassA");
    [str release];
    [super dealloc];
}
@end

int main (int argc, char *argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSMutableString  *myStr =
                  [NSMutableString stringWithString: @"acuch "];
    ClassA  *myA = [[ClassA alloc] init];

    NSLog (@"Liczba referencji do obiektu myStr: %x", [myStr retainCount]);
    [myA autorelease];

    [myA setStr: myStr];
    NSLog (@"Liczba referencji do obiektu myStr: %x", [myStr retainCount]);

    [pool drain];
    return 0;
}